<?php
namespace app\common\classes;
class Redis
{

    protected $hostname;
    protected $port;
    protected $database;
    protected $password;
    protected $redis;

    /**
     * 构造实例
     */
    public function __construct($config)
    {
        $this->hostname = $config['hostname'];
        $this->port     = $config['port'];
        $this->database = $config['database'];
        $this->password = $config['password'];

        $this->redis = new \Redis();

        $this->redis->connect($this->hostname, $this->port, 1);

        if ($this->password) {
            $this->redis->auth($this->password);
        }

        $this->redis->select($this->database);

    }

    /**
     * 设置key的有效期
     */
    public function expireKey($key, $timeout)
    {
        $this->redis->expire($key, $timeout);
    }

    /**
     * 字符串 -- 数据类型(String)
     * 设置值
     */
    public function setString($key, $value)
    {
        $result = $this->redis->set($key, $value);
        return $result == 'OK' ? true : false;
    }

    /**
     * 字符串 -- 数据类型(String)
     * 获取值
     */
    public function getString($key)
    {
        $result = $this->redis->get($key);
        return $result ? $result : '';
    }

    /**
     * 无序集合 -- 数据类型(Set)
     * 添加单个集合成员
     */
    public function setMember($key, $value)
    {
        $this->redis->sAdd($key, $value);
    }

    /**
     * 无序集合 -- 数据类型(Set)
     * 添加多个集合成员
     */
    public function setMembers($key, array $values)
    {
        $this->redis->sAddArray($key, $values);
    }

    /**
     * 无序集合 -- 数据类型(Set)
     * 移除单个集合成员
     */
    public function removeMembers($key, $value)
    {
        $this->redis->sRem($key, $value);
    }


    /**
     * 无序集合 -- 数据类型(Set)
     * 返回集合的所有成员
     */
    public function getMembers($key)
    {
        $result = $this->redis->sMembers($key);
        return $result;
    }

    /**
     * 无序集合 -- 数据类型(Set)
     * 返回集合的个数
     */
    public function getCountMembers($key)
    {
        $count = $this->redis->sCard($key);
        return $count;
    }

    /**
     * 无序集合 -- 数据类型(Set)
     * 判断成员是否是该集合的成员
     */
    public function checkMember($key, $value)
    {
        $result = $this->redis->sIsMember($key, $value);
        return $result > 0 ? true : false;
    }

    /**
     * 列表 -- 数据类型(list)
     * 插入数据至队列尾部
     */
    public function rPushList($key, $value)
    {
        $this->redis->rPush($key, $value);
    }

    /**
     * 列表 -- 数据类型(list)
     * 插入数据至队列头部
     */
    public function lPushList($key, $value)
    {
        $this->redis->lPush($key, $value);
    }

    /**
     * 列表 -- 数据类型(list)
     * 获取并移除队列第一个元素
     */
    public function lPopList($key)
    {
        $result = $this->redis->lPop($key);
        return $result ? $result : '';
    }

    /**
     * 列表 -- 数据类型(list)
     * 获取并移除队列最后一个元素
     */
    public function rPopList($key)
    {
        $result = $this->redis->rPop($key);
        return $result ? $result : '';
    }

    /**
     * 列表 -- 数据类型(list)
     * 获取队列指定范围内的元素
     */
    public function lRangeList($key, $start, $end)
    {
        $result = $this->redis->lRange($key, $start, $end);
        return $result;
    }

    /**
     * 列表 -- 数据类型(list)
     * 获取队列长度
     */
    public function lLenList($key)
    {
        $count = $this->redis->lLen($key);
        return $count;
    }


}